// #include <stdio.h>
// #include "esp_log.h"
// #include "https_download.h"
// #include "SD_MMC.h"

// #define TAG "HttpsDownload"

// esp_err_t HttpsDownload::eventHandler(esp_http_client_event_t *evt)
// {
//     HttpsDownload *download = static_cast<HttpsDownload *>(evt->user_data);
//     switch (evt->event_id)
//     {
//     case HTTP_EVENT_ERROR:
//         ESP_LOGE(TAG, "HTTP_EVENT_ERROR");
//         download->updateStatus(DownloadStatus::FAILED);
//         break;
//     case HTTP_EVENT_ON_CONNECTED:
//         ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED");
//         download->startTime = xTaskGetTickCount();
//         download->updateStatus(DownloadStatus::DOWNLOADING);
//         break;
//     case HTTP_EVENT_HEADER_SENT:
//         ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT");
//         break;
//     case HTTP_EVENT_ON_HEADER:
//         ESP_LOGI(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
//         if (strcmp(evt->header_key, "Content-Length") == 0)
//         {
//             download->totalSize = atoi(evt->header_value);
//             ESP_LOGI(TAG, "Total file size: %zu bytes", download->totalSize);
//         }
//         break;
//     case HTTP_EVENT_ON_FINISH:
//     {
//         int status_code = esp_http_client_get_status_code(evt->client);
//         if (status_code == 200)
//         {
//             ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH, Status Code: %d", status_code);
//             if (download->file)
//             {
//                 download->file.close();
//             }
//             // 检查是否下载完成
//             if (download->downloadedSize == download->totalSize)
//             {
//                 download->updateStatus(DownloadStatus::COMPLETED);
//                 float progress = download->getDownloadPercentage();
//                 ESP_LOGI(TAG, "[%s] Downloaded %.2f%% (%zu bytes out of %zu bytes), Average Speed: %.2f B/s",
//                     download->info.filePath.c_str(), progress, download->downloadedSize, download->totalSize, download->getAverageDownloadSpeed());
//             }
//             else
//             {
//                 download->updateStatus(DownloadStatus::FAILED);
//             }
//         }
//         else
//         {
//             ESP_LOGE(TAG, "Invalid status code %d, download failed", status_code);
//             if (download->file)
//             {
//                 download->file.close();
//                 SD_MMC.remove(download->info.filePath.c_str());
//             }
//             download->updateStatus(DownloadStatus::FAILED);
//         }
//         break;
//     }
//     case HTTP_EVENT_DISCONNECTED:
//         ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
//         if (download->file)
//         {
//             download->file.close();
//         }
//         // 判断是否下载完成
//         if (download->downloadedSize != download->totalSize)
//         {
//             download->updateStatus(DownloadStatus::FAILED);
//         }
//         break;
//     case HTTP_EVENT_ON_DATA:
//     {
//         int status_code = esp_http_client_get_status_code(evt->client);
//         if (status_code == 200)
//         {
//             // ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
//             if (!esp_http_client_is_chunked_response(evt->client))
//             {
//                 if (download->file)
//                 {
//                     download->file.write((const uint8_t *)evt->data, evt->data_len);
//                     download->downloadedSize += evt->data_len;

//                     // 计算并输出下载百分比进度
//                     if (download->totalSize > 0)
//                     {
//                         float progress = download->getDownloadPercentage();
//                         // ESP_LOGI(TAG, "[%s] Downloaded %.2f%% (%zu bytes out of %zu bytes), Average Speed: %.2f B/s",
//                         //          download->info.filePath.c_str(), progress, download->downloadedSize, download->totalSize, download->getAverageDownloadSpeed());
//                     }
//                 }
//                 else
//                 {
//                     ESP_LOGE(TAG, "File pointer is null, cannot write data");
//                     download->updateStatus(DownloadStatus::FAILED);
//                 }
//             }
//         }
//         break;
//     }
//     default:
//         break;
//     }
//     return ESP_OK;
// }

// HttpsDownload::HttpsDownload(HttpsDownloadInfo_t &info)
//     : info(info), totalSize(0), downloadedSize(0),
//       status(DownloadStatus::IDLE), eventCallback(nullptr), retryCount(0), startTime(0)
// {


//     esp_http_client_config_t config = {0};
//     config.url = this->info.url.c_str();
//     config.event_handler = eventHandler;
//     config.user_data = this;

//     // 根据 URL 和 certPem 判断是否为 HTTPS 协议
//     if (this->info.url.startsWith("https://") && info.certPem != nullptr)
//     {
//         config.cert_pem = this->info.certPem;
//     }
//     else
//     {
//         config.cert_pem = nullptr;
//     }

//     // 调整缓冲区大小
//     config.buffer_size = 1024;    // 增大接收缓冲区大小
//     config.buffer_size_tx = 1024; // 增大发送缓冲区大小

//     // 设置超时时间
//     config.timeout_ms = 5000; // 5 秒超时

//     client = esp_http_client_init(&config);
// }

// HttpsDownload::~HttpsDownload()
// {
//     ESP_LOGI(TAG, "HttpsDownload::~HttpsDownload()");
//     esp_http_client_cleanup(client);
// }

// esp_err_t HttpsDownload::performDownload()
// {
//     // 打开文件进行写入
//     file = SD_MMC.open(info.filePath, FILE_WRITE);
//     if (!file)
//     {
//         ESP_LOGE(TAG, "Failed to open file for writing");
//         updateStatus(DownloadStatus::FAILED);
//         return ESP_FAIL;
//     }

//     esp_err_t err = esp_http_client_perform(client);
//     if (err != ESP_OK)
//     {
//         ESP_LOGE(TAG, "HTTP client perform failed");
//         updateStatus(DownloadStatus::FAILED);
//     }

//     if (file)
//     {
//         file.close();
//     }
//     return err;
// }

// esp_err_t HttpsDownload::startDownload()
// {
//     if (status == DownloadStatus::DOWNLOADING)
//     {
//         ESP_LOGW(TAG, "Download is already in progress");
//         return ESP_FAIL;
//     }

//     // 如果 info.filePath 为空，则将 info.url 的最后一个 / 后的文件名作为 filePath
//     if (info.filePath.isEmpty())
//     {
//         int lastSlashIndex = info.url.lastIndexOf('/');
//         if (lastSlashIndex != -1)
//         {
//             info.filePath = "/" + info.url.substring(lastSlashIndex + 1);

//         }
//     }
//     ESP_LOGI(TAG, "info.filepath = %s", info.filePath.c_str());

//     // 检查文件是否存在，若存在则删除
//     if (SD_MMC.exists(info.filePath))
//     {
//         ESP_LOGI(TAG, "File already exists. Deleting and starting a fresh download...");
//         if (!SD_MMC.remove(info.filePath))
//         {
//             ESP_LOGE(TAG, "Failed to delete the existing file.");
//             updateStatus(DownloadStatus::FAILED);
//             return ESP_FAIL;
//         }
//         downloadedSize = 0; // 重置已下载字节数
//     }

//     esp_err_t err = ESP_OK;
//     while (retryCount < MAX_RETRIES)
//     {
//         err = performDownload();
//         if (err == ESP_OK)
//         {
//             break;
//         }
//         retryCount++;
//         ESP_LOGW(TAG, "Download failed, retrying (%d/%d)...", retryCount, MAX_RETRIES);
//         vTaskDelay(pdMS_TO_TICKS(2000)); // 等待 2 秒后重试
//     }
//     if (err != ESP_OK)
//     {
//         ESP_LOGE(TAG, "Download task failed after %d retries", MAX_RETRIES);
//         updateStatus(DownloadStatus::FAILED);
//     }

//     ESP_LOGI(TAG, "xTaskCreate HttpsDownload");

//     return ESP_OK;
// }

// DownloadStatus HttpsDownload::getStatus()
// {
//     return status;
// }

// void HttpsDownload::setEventCallback(DownloadEventCallback callback)
// {
//     eventCallback = callback;
// }

// void HttpsDownload::updateStatus(DownloadStatus newStatus)
// {
//     status = newStatus;
//     if (eventCallback != nullptr)
//     {
//         eventCallback(status);
//     }
// }

// size_t HttpsDownload::getTotalSize()
// {
//     return totalSize;
// }

// size_t HttpsDownload::getDownloadedSize()
// {
//     return downloadedSize;
// }

// float HttpsDownload::getDownloadPercentage()
// {
//     if (totalSize == 0)
//     {
//         return 0.0f;
//     }
//     return (float)downloadedSize / totalSize * 100;
// }

// float HttpsDownload::getAverageDownloadSpeed()
// {
//     TickType_t currentTime = xTaskGetTickCount();
//     TickType_t elapsedTicks = currentTime - startTime;
//     if (elapsedTicks == 0)
//     {
//         return 0.0f;
//     }
//     float elapsedSeconds = (float)elapsedTicks / configTICK_RATE_HZ;
//     return (float)downloadedSize / elapsedSeconds;
// }